
import CommonUtil from "../utils/commonUtil.js";

/**
 * @description 基础对象封装
 * @class {BaseObject}
 * @author hhx
 * @date 2024-11-30 16:11
 * @version 0.1.2
 */
export default class BaseObject {

    /**
     * @description 属性存储
     * @private
     * @type {Map}
     */
    _properties = null;

    /**
     * @description 基础对象构造函数
     * @constructor
     * @param props {object} 配置对象
     */
    constructor(props) {
        this.initProps(props);
    }

    //=================================== 内部成员 =======================================

    /**
     * @description 获取 属性存储
     * @member
     * @protected
     * @returns {Map} 属性存储
     */
    get properties() {
        return this._properties;
    }

    /**
     * @description 设置 属性存储
     * @member
     * @protected
     * @param value {Map} 属性存储
     */
    set properties(value) {
        this._properties = value;
    }

    //=================================== 成员方法 =======================================

    /**
     * @description 获取 属性存储
     * @public
     * @returns {Map} 属性存储
     */
    getProperties() {
        return this.properties;
    }

    /**
     * @description 设置 属性存储
     * @public
     * @param value {Map} 属性存储
     */
    setProperties(value) {
        this.properties = value;
    }

    /**
     * @description 是否存在 属性存储
     * @public
     * @returns {boolean} true 是 false 否
     */
    hasProperties() {
        return this.isNotNull(this.properties);
    }

    //=================================== 基础属性 =======================================


    //=================================== 属性方法 =======================================



    //=================================== 内部方法 =======================================

    /**
     * @description 判断非空对象
     * @protected
     */
    isNotNull(props) {
        return Object.keys(props).length > 0 || props.length>0;
    }

    //=================================== 构造方法 =======================================

    /**
     * @description 初始化方法
     * @protected
     * @abstract
     */
    init() { }

    /**
     * @description 初始化 属性
     * @protected
     * @param props {object} 配置对象
     */
    initProps(props) {

        // 初始化 属性存储
        this.properties = new Map();

        // 处理参数
        this.handleProps(props);

    }

    /**
     * @description 处理 属性存储
     * @protected
     * @param props {*}
     */
    handleProps(props) {

        if (this.isObject(props)) {
            for (const i in props) {
                this.properties.set(i, props[i]);
            }
        }

    }

    //=================================== 接口方法 =======================================

    /**
     * @description 判断是否为json对象类型
     * @public
     * @param props {*} 目标对象
     * @returns {boolean} true 是 false 否
     */
    isObject(props) {
        return CommonUtil.isObject(props);
    }

    /**
     * @description 判断是否为数组
     * @public
     * @param props {*} 目标对象
     * @returns {boolean} true 是 false 否
     */
    isArray(props) {
        return CommonUtil.isArray(props);
    }

    /**
     * @description 判断是否为string类型
     * @public
     * @param props {*} 目标对象
     * @returns {boolean} true 是 false 否
     */
    isString(props) {
        return CommonUtil.isString(props);
    }

    /**
     * @description 判断是否为Number类型
     * @public
     * @param props {*} 目标对象
     * @returns {boolean} true 是 false 否
     */
    isNumber(props) {
        return CommonUtil.isNumber(props);
    }

    /**
     * @description 判断两个值是否相等
     * @public
     * @param prop1 {*} 目标对象
     * @param prop2 {*} 目标对象
     * @returns {boolean} true 是 false 否
     */
    isEquality(prop1, prop2) {
        return CommonUtil.isEquality(prop1, prop2);
    }

    /**
     * @description 获取属性值
     * @protected
     * @param propName {string} 属性名称
     * @returns {*} 属性值
     */
    getPropValue(propName) {
        return this.properties.get(propName);
    }

    /**
     * @description 设置属性值
     * @protected
     * @param propName {string} 属性名称
     * @param value {*} 属性值
     */
    setPropValue(propName, value) {
        this.properties.set(propName, value);
    }

    /**
     * @description 判断是否存在属性值
     * @protected
     * @param propertyName {string} 属性名称
     * @return  {Boolean} true 是 false 否
     */
    hasProperty(propertyName) {
        return this.properties.has(propertyName);
    }

    /**
     * @description 非空判断
     * @protected
     * @param props {*} 判断值
     * @returns {boolean} true 是 false 否
     */
    isNotEmpty(props){

        if (props === null || props === undefined) {
            return false;
        }

        if (CommonUtil.isString(props)) {
            return props.length > 0;
        }

        if (CommonUtil.isArray(props)) {
            return props.length > 0;
        }

        if (CommonUtil.isObject(props)) {
            return Object.keys(props).length > 0 || props.size>0;
        }

        return true;
    }


    //=========================== 创建方法 ===============================

    //=========================== 构建方法 ===============================

    //=========================== 重载方法 ===============================

    //=========================== 控制方法 ===============================
}

